package ar.edu.utn.frba.disenio.gui.windows;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.layout.VerticalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.TextBox;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.WindowOwner;
import org.uqbar.commons.model.UserException;

import ar.edu.utn.frba.disenio.application.model.BusquedaModel;
import ar.edu.utn.frba.disenio.gui.transformes.AerolineaTransformer;
import ar.edu.utn.frba.disenio.gui.transformes.BigDecimalTransformer;
import ar.edu.utn.frba.disenio.gui.transformes.CategoriaTransformer;
import ar.edu.utn.frba.disenio.gui.transformes.DestinoTransformer;
import ar.edu.utn.frba.disenio.gui.transformes.FechaAdapter;
import ar.edu.utn.frba.disenio.gui.transformes.NumeroAsientoTransformer;
import ar.edu.utn.frba.disenio.gui.transformes.OrigenTransformer;
import ar.edu.utn.frba.disenio.gui.transformes.UbicacionTransformer;
import ar.edu.utn.frba.disenio.model.Asiento;
import ar.edu.utn.frba.disenio.model.AsientoYaReservadoException;
import ar.edu.utn.frba.disenio.model.exceptions.AsientoNoDisponibleException;
import ar.edu.utn.frba.disenio.model.exceptions.AsientoYaCompradoException;
import ar.edu.utn.frba.disenio.model.exceptions.YaLoReservoElMismoException;

@SuppressWarnings("serial")
public class BuscarAsientosWindow extends SimpleWindow<BusquedaModel> {

	public BuscarAsientosWindow(WindowOwner parent, BusquedaModel model) {
		super(parent, model);
	}

	@Override
	protected void addActions(Panel unPanel) {
		unPanel.setLayout(new HorizontalLayout());
		
        new Button(unPanel)
        	.setCaption("Comprar")
        	.onClick(new MessageSend(this, "realizarCompra"));
        
        new Button(unPanel)
        	.setCaption("Reservar")
        	.onClick(new MessageSend(this, "realizarReserva"));
        
        Button cerrar = new Button(unPanel);
        cerrar.setCaption("Cerrar");
        cerrar.onClick(new MessageSend(this, "close"));
	}
	
	@Override
	protected void createFormPanel(Panel unPanel) {
		this.setTitle("Aterrizar.com");
		unPanel.setLayout(new VerticalLayout());
		
		new Label(unPanel)
			.setText("Origen");
		
		new TextBox(unPanel)
			.bindValueToProperty("origen")
			.setTransformer(new OrigenTransformer());
		
		new Label(unPanel)
			.setText("Destino");
		
		new TextBox(unPanel)
			.bindValueToProperty("destino")
			.setTransformer(new DestinoTransformer());
		
		new Label(unPanel)
			.setText("Fecha");
			
		new TextBox(unPanel)
			.bindValueToProperty("salida")
			.setTransformer(new FechaAdapter());
			
		new Button(unPanel)
			.setCaption("Buscar")
			.onClick(new MessageSend(this.getModelObject(), "buscar"))
			.disableOnError();
		
		Table<Asiento> tablaDeAsientos = new Table<Asiento>(unPanel, Asiento.class);
		
		tablaDeAsientos.setHeigth(300);
		tablaDeAsientos.setWidth(450);
		tablaDeAsientos.bindSelection("asientoSeleccionado");
		tablaDeAsientos.bindItemsToProperty("asientosEncontrados");
		
		new Column<Asiento>(tablaDeAsientos)
			.setTitle("Aerolinea")
			.bindContentsToProperty("aerolinea")
			.bindContentsToTransformer(new AerolineaTransformer());
		
		new Column<Asiento>(tablaDeAsientos)
			.setTitle("Vuelo")
			.bindContentsToProperty("codigoVuelo");
		
		new Column<Asiento>(tablaDeAsientos)
			.setTitle("Asiento")
			.bindContentsToProperty("numeroDeAsiento")
			.bindContentsToTransformer(new NumeroAsientoTransformer());
		
		new Column<Asiento>(tablaDeAsientos)
			.setTitle("Precio")
			.bindContentsToProperty("precioBase")
			.bindContentsToTransformer(new BigDecimalTransformer());
		
		new Column<Asiento>(tablaDeAsientos)
			.setTitle("Ubicacion")
			.bindContentsToProperty("ubicacion")
			.bindContentsToTransformer(new UbicacionTransformer());
		
		new Column<Asiento>(tablaDeAsientos)
			.setTitle("Clase")
			.bindContentsToProperty("categoria")
			.bindContentsToTransformer(new CategoriaTransformer());
		
	}
	
	public void realizarCompra(){
		try {
			this.getModelObject().comprar();
			new CompraConfirmadaWindow(this.getOwner(), this.getModelObject().getAsientoSeleccionado()).open();
		} catch (AsientoYaCompradoException e){
			new ErrorCompraWindow(this.getOwner(), this.getModelObject().getAsientoSeleccionado(), "asiento ya comprado.").open();
		} catch (AsientoYaReservadoException e){
			new ErrorCompraWindow(this.getOwner(), this.getModelObject().getAsientoSeleccionado(), "asiento ya reservado.").open();
		} catch (AsientoNoDisponibleException e) {
			new ErrorCompraWindow(this.getOwner(), this.getModelObject().getAsientoSeleccionado(), "asiento no disponible. Contactar Aerolinea.").open();
		}
	}
	
	public void realizarReserva(){
	    if (this.getModelObject().getAsientoSeleccionado().estaReservado()) {
			new SobrereservaWindow(this.getOwner(), this.getModelObject()).open();
			return;
		}
		
		try {
			this.getModelObject().getAsientoSeleccionado().reservar(this.getModelObject().getUsuario());
			new ReservaConfirmadaWindow(this.getOwner(), this.getModelObject().getAsientoSeleccionado()).open();
		} catch (AsientoNoDisponibleException e){
			new ErrorReservaWindow(this.getOwner(), this.getModelObject().getAsientoSeleccionado(), "asiento ya reservado.").open();
		} catch (AsientoYaCompradoException e) {
			new ErrorReservaWindow(this.getOwner(), this.getModelObject().getAsientoSeleccionado(), "asiento ya comprado.").open();
		} 
	}
	
}
